package infra

import (
	"gitee.com/slion/helper"
	"github.com/tietang/props/kvs"
)

// 基础资源上下文
type StartContext map[string]interface{}

// 从基础资源上下文获取配置信息
func (ctx StartContext) GetProps() kvs.ConfigSource{
	conf := ctx[helper.MapKeyConf]
	return conf.(kvs.ConfigSource)
}

// 基础资源启动器接口
type Starter interface {
	// 1. 系统启动,初始化系统基础资源
	Init(StartContext)
	// 2. 系统资源的安装
	Setup(StartContext)
	// 3. 启动基础资源
	Start(StartContext)
	// 启动器是否阻塞
	StartBlocking() bool
	// 4. 资源的停止和销毁
	Stop(StartContext)
}

// 资源空启动器的实现
type BaseStarter struct {}

func (b *BaseStarter) Init(ctx StartContext) {}
func (b *BaseStarter) Setup(ctx StartContext) {}
func (b *BaseStarter) Start(ctx StartContext) {}
func (b *BaseStarter) StartBlocking() bool {return false}
func (b *BaseStarter) Stop(ctx StartContext) {}


// 启动器的注册器
type startRegister struct {
	starters []Starter // 启动器切片(启动器的集合数组)
}

// 注册启动器
func (s *startRegister) RegisterStarter(starter Starter){
	s.starters = append(s.starters, starter)
}

// 返回所有的启动器(方便管理启动器的生命周期)
func (s *startRegister) AllStarters() []Starter{
	return s.starters
}

// startRegister的实例
var StartRegister = new(startRegister)

// 返回所有的starter(对外暴露)
func GetStarters() []Starter{
	return StartRegister.AllStarters()
}